﻿using StudentWeb.Common;
using StudentWeb.IDAL;
using StudentWeb.Model;

namespace StudentWeb.BLL
{
    public record StudentInfo
    (
        int StudentID,
        string StudentNo,
        string Name,
        string Password,
        string Mobile,
        string Grade,
        string Major,
        string Class,
        string Sex
    );
    /// <summary>
    /// 业务逻辑层（Business Object），负责处理学生相关的业务逻辑
    /// </summary>
    [Service(EServLife.Scoped)] // 依赖注入的生命周期设为 Scoped，确保每个请求获得独立实例
    public class StudentBO(IStudentDataDAO studentDataDAO)
    {
        #region 分页查询学生信息
        /// <summary>
        /// 分页查询学生信息
        /// </summary>
        /// <param name="pageIndex">当前页索引</param>
        /// <param name="pageSize">每页显示的记录数</param>
        /// <param name="condition">查询条件</param>
        /// <returns>分页学生列表</returns>
        public IResult PagedList(int pageIndex, int pageSize, dynamic condition)
        {
            // 初始化查询条件
            string? where = null;

            // 根据条件构建查询语句
            if (condition != null) // 检查查询条件是否不为空
            {
                if (condition.Name != null) // 检查查询条件中是否包含 Name
                {
                    // 如果查询条件中包含 Name，则构建查询条件字符串
                    // 使用 LIKE 操作符进行模糊查询，匹配包含指定 Name 的记录
                    where = $"Name like '%'+@Name+'%'";
                }
                if (condition.StudentNo != null) // 检查查询条件中是否包含 StudentNo
                {
                    // 如果查询条件中已经包含其他条件，则在前面加上" and"
                    if (where != null) where += " and ";
                    // 如果查询条件中包含 StudentNo，则构建查询条件字符串
                    // 使用 LIKE 操作符进行模糊查询，匹配包含指定 StudentNo 的记录
                    where += $"StudentNo like '%'+@StudentNo+'%'";
                }
            }

            // 将条件转换为参数对象
            var param = BllHelper.ToParamObj(condition);

            // 调用数据访问层（DAL）获取分页数据
            var list = studentDataDAO.GetList(pageIndex, pageSize, where, param);

            // 以统一格式返回数据
            return Result.Data(list);
        }
        #endregion

        #region 查询单条学生信息
        /// <summary>
        /// 查询单条学生信息
        /// </summary>
        /// <param name="studentID">学生ID</param>
        /// <returns>学生信息</returns>
        public IResult GetInfo(int studentID)
        {
            // 调用数据访问层（DAL）获取指定学生信息
            var res = studentDataDAO.GetInfo(studentID);

            // 以统一格式返回数据
            return Result.Data(res);
        }
        #endregion
        #region 添加单条学生信息
        /// <summary>
        /// 添加单条学生信息
        /// </summary>
        /// <param name="model">学生信息模型</param>
        /// <returns>操作结果</returns>
        public IResult Insert(StudentInfo model)
        {
            // 创建一个新的 StudentData 实例，并将 StudentInfo 模型中的数据赋值给它
            var record = new StudentData
            {
                StudentNo = model.StudentNo, // 学生学号
                Name = model.Name, // 学生姓名
                Password = model.Password, // 学生密码
                Mobile = model.Mobile, // 学生手机号码
                Grade = model.Grade, // 学生年级
                Major = model.Major, // 学生专业
                Class = model.Class, // 学生班级
                Sex = model.Sex // 学生性别
            };

            // 调用数据访问层（DAL）插入学生记录，并获取插入操作的影响行数
            int ret = studentDataDAO.Insert(record);

            // 返回操作结果，包含新插入的学生ID和操作状态码
            return ret > 0 ? Result.OK("添加成功", new { record.StudentID }) : Result.Fail("添加失败");
        }
        #endregion
        #region 修改单条学生信息
        /// <summary>
        /// 修改单条学生信息
        /// </summary>
        /// <param name="model">学生信息模型</param>
        /// <returns>操作结果</returns>
        public IResult Update(StudentInfo model)
        {
            // 根据 StudentID 获取数据库中的原始学生数据
            var record = studentDataDAO.GetInfo(model.StudentID);

            // 如果未找到对应的学生记录，则返回失败结果
            if (record == null) return Result.Fail("学生信息不存在");

            // 更新学生数据字段
            record.Name = model.Name;       // 学生姓名
            record.Mobile = model.Mobile;   // 学生手机号码
            record.Grade = model.Grade;     // 学生年级
            record.Major = model.Major;     // 学生专业
            record.Class = model.Class;     // 学生班级
            record.Sex = model.Sex;         // 学生性别

            // 调用数据访问层（DAL）更新学生记录，并获取受影响行数
            int ret = studentDataDAO.Update(record);

            // 返回操作结果，包含修改的学生ID和操作状态码
            return ret > 0 ? Result.OK("修改成功", new { record.StudentID }) : Result.Fail("修改失败");
        }
        #endregion
        #region 删除单条学生信息
        /// <summary>
        /// 删除单条学生信息
        /// </summary>
        /// <param name="studentID">学生ID</param>
        /// <returns>操作结果</returns>
        public IResult Delete(int studentID)
        {
            // 调用数据访问层（DAL）删除指定学生信息
            var res = studentDataDAO.Delete(studentID);

            // 以统一格式返回数据
            return Result.Data(res);
        }
        #endregion
    }
}